package com.lins.storedisk.config.inteceptor;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Author linshuo
 * @Date 2023/12/4 16:04
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        WebMvcConfigurer.super.addInterceptors(registry);

//        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");      //全部拦截

//        registry.addInterceptor(new SaInterceptor(Handle -> StpUtil.checkLogin())) //全部拦截策略是检查登录，只放行登录请求
//                .addPathPatterns("/**")
//                .excludePathPatterns("/user/doLogin");

        //自定义认证规则
//        registry.addInterceptor(new SaInterceptor(handler -> {
//            // 指定一条 match 匹配规则
//            SaRouter.match("/**")    // 拦截的 path 列表，可以写多个 */
//                    .notMatch("/user/doLogin")        // 排除掉的 path 列表，可以写多个
//                    .check(r -> StpUtil.checkLogin());        // 要执行的校验动作，可以写完整的 lambda 表达式
//
//            // 根据路由划分模块，不同模块不同鉴权
////            SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
////            SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
////            SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
////            SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
////            SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
////            SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
//        })).addPathPatterns("/**"); //方便开发  先关闭拦截

    }


    /**
     * 注册 [Sa-Token 全局过滤器]
     */
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
                // 指定 [拦截路由] 与 [放行路由]
                .addInclude("/**").addExclude("/favicon.ico")

                // 认证函数: 每次请求执行 打印日志
                .setAuth(obj -> SaManager.getLog().debug("请求path={}  提交token={}",
                        SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue()))

                // 异常处理函数：每次认证函数发生异常时执行此函数 抛出异常
                .setError(e -> SaResult.error(e.getMessage()))

                // 前置函数：在每次认证函数之前执行
                .setBeforeAuth(obj -> {
                    //设置跨域响应头
                    SaHolder.getResponse()
                            .setHeader("Access-Control-Allow-Origin", "*")// 允许所有域访问跨域资源
                            .setHeader("Access-Control-Allow-Methods", "*")// 允许所有的请求方式
                            .setHeader("Access-Control-Allow-Headers", "*")// 允许所有的header参数
                            .setHeader("Access-Control-Max-Age", "3600")// 访问最大有效时间
                    ;
                    // 如果是预检请求，不做处理，立即返回到前端
                    SaRouter.match(SaHttpMethod.OPTIONS)
                            .free(r -> System.out.println("--------OPTIONS预检请求，不做处理"))
                            .back();
                })
                ;
    }
}
